package br.ufpb.di.ppgi.persistencia.domainstore;

import java.util.Collection;
import java.util.List;




public interface DomainStore {


	boolean isAutoCommit();
	void setAutoCommit(boolean autoCommit);
	/**
	 * Se é para realizar um rollback, quando o proprio {@link DomainStore}
	 * inicia a tranzação, ou seja, quando <tt>{@link #isAutoCommit()} == true</tt>
	 */
	boolean isAutoRollback();
	/**
	 * Ajusta se é para realizar um rollback, quando o proprio {@link DomainStore}
	 * inicia a tranzação, ou seja, quando <tt>{@link #isAutoCommit()} == true</tt>
	 */
	void setAutoRollback(boolean autoRollback);
	void beginTransaction();
	boolean isTrasactionActive();
	void commit();
	void rollback();
	<T> T get(Class<T> target, Object id);
	void add(Object entity);
	Object getDelegate();
	/**
	 * Lista todas as entidades do tipo <tt>target</tt>.
	 * @param target o tipo da entidade a qual sera buscada.
	 */
//	<T> List<T> list(Class<T> target);
	/**
	 * Busca e remove a entidade do tipo <tt>&lt;T&gt;</tt> com o <tt>id</tt>
	 * passado.  
	 * @param <T> o tipo da entidade
	 * @param target a classe do tipo da entidade
	 * @param id o ID da entidade
	 * @return a entidade que foi removida, ou <tt>null</tt> caso não haja entidade
	 * 			para o ID enviado.
	 */
	<T> T remove(Class<T> target, Object id);
	/**
	 * Remove a entidade enviada.
	 * @param entity a entidade a ser removida.
	 */
	void remove(Object entity);
	/**
	 * Atualiza a entidade enviada.
	 * @param entity a entidade a ser atualizada.
	 * @return a entidade gerenciada atualizada.
	 */
	<T> T merge(T entity);
	void addAll(Object ... entitys);
	void addAll(Collection<?> entitys);
	<T> List<T> list(Class<T> target, String ... properties);

}
	